﻿using System;
using System.Windows;
using Microsoft.Win32;
using System.Text.RegularExpressions;
using System.Threading;
using System.Windows.Media;


[assembly: CLSCompliant(true)]
namespace SimulacionExcelIne
{
    //Barra de progreso se maneja mediante un hilo
    public delegate void ActualizarBarra(double minimum, double maximum, double value);

    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        SimulacionLibro SimLibro;
        Thread sim;


        public ActualizarBarra delegadoBarra;
        public void ActualizarBarraMethod(double minimum, double maximum, double value)
        {
            this.BarraDeProgreso.Minimum = minimum;
            this.BarraDeProgreso.Maximum = maximum;
            this.BarraDeProgreso.Value = value;
            System.Windows.Forms.Application.DoEvents();
        }   

        public MainWindow()
        {
            InitializeComponent();
        }

        /// <summary>
        /// Abrir Archivo Excel
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonAbrirArchivo_Click(object sender, RoutedEventArgs e)
        {      
             textBoxPath.Text = GetPathExcelFile();
            // Válido si efectivamente se selecciono un archivo
        }

        /// <summary>
        /// Retorna la ruta de un archivo excel seleccionado mediante una ventana de selección
        /// </summary>
        /// <returns>string</returns>
        static private string GetPathExcelFile()
        {
            OpenFileDialog dialogo = new OpenFileDialog();

            //Directorio inicial
            dialogo.InitialDirectory = @"c:\";
            //Tipo de archivos aceptados
            dialogo.Filter = "Archivo Excel Office 2007-2010 (*xlsx) |*xlsx | Archivo excel office 2003-2007 (*.xls)| *.xls";
            dialogo.Title = "Seleccione el archivo excel en el cual se encuentran los datos";
            dialogo.FilterIndex = 2;
            dialogo.RestoreDirectory = true;

            dialogo.ShowDialog();

            if (!String.IsNullOrEmpty(dialogo.SafeFileName))
            {
                return dialogo.FileName;
            }
            else return "";
        }//Desarrollado

        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
        }


        /// <summary>
        /// Evento de presionar el boton de simulacion
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void buttonSimular_Click(object sender, RoutedEventArgs e)
        {
            //Existe una ruta para un archivo?
            if (existeRuta())
            {
                if (EstaDefinidoElError())
                {
                    SimLibro = new SimulacionLibro(textBoxPath.Text, textBoxError.Text, BarraDeProgreso);
                    AsignarTamanioDeProgressBar(SimLibro, BarraDeProgreso);
                    delegadoBarra = new ActualizarBarra(ActualizarBarraMethod);
                    sim = new Thread(new ThreadStart(HiloSimulacion));
                    sim.Start();
                }
                else
                {
                    MessageBox.Show("Defina el error");
                }
            }
            else
            {
                MessageBox.Show("No hay una ruta especificada con un archivo Excel");
            }
        }

        private bool EstaDefinidoElError()
        {
            return textBoxError.Text != "";
        }

        private bool existeRuta()
        {
            return textBoxPath.Text != "";
        }

        private void AsignarTamanioDeProgressBar(SimulacionLibro SimLibro, System.Windows.Controls.ProgressBar BarraDeProgreso)
        {
            BarraDeProgreso.Minimum = 0;
            BarraDeProgreso.Maximum = SimLibro.get_tamanioLibro();
        }

        private void HiloSimulacion()
        {
            SimLibro.EstandarizarArchivo(this, this.delegadoBarra);
            SimLibro.GuardarSimulacion();
        }

        private void Window_Closed(object sender, EventArgs e)
        {
            //Al cerrar la ventana hay que deterner el hilo
            if (sim != null)
            {
                sim.Abort();
            }
        }

        private void StackOpenFile_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
        {
            StackOpenFile.Background = new SolidColorBrush(Colors.AliceBlue);
        }

        private void StackOpenFile_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
        {
            StackOpenFile.Background = new SolidColorBrush(Colors.White);
        }

        private void ErrorAceptadoStackPanel_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
        {
            ErrorAceptadoStackPanel.Background = new SolidColorBrush(Colors.AliceBlue);
        }

        private void ErrorAceptadoStackPanel_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
        {
            ErrorAceptadoStackPanel.Background = new SolidColorBrush(Colors.White);
        }

        private void StackPanelSimular_MouseEnter(object sender, System.Windows.Input.MouseEventArgs e)
        {
            StackPanelSimular.Background = new SolidColorBrush(Colors.AliceBlue);
        }

        private void StackPanelSimular_MouseLeave(object sender, System.Windows.Input.MouseEventArgs e)
        {
            StackPanelSimular.Background = new SolidColorBrush(Colors.White);
        }
    }
}
